package com.common.app.utls.network.interceptor

import android.os.Build
import android.util.Log
import com.common.app.data.repository.HomeApi
import com.common.app.utls.BrotliCompressionEx.sortAndConcatenateFieldsByJo
import com.common.app.utls.MD5Utils
import com.common.app.utls.TimeUtils
import com.common.app.utls.Utils
import com.common.base.app.extras.isNoEmpty
import com.common.base.app.extras.yes
import com.common.base.utils.IStringUtils
import okhttp3.Interceptor
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import okio.Buffer
import org.json.JSONObject


/**
 *
 * 作者：sosou
 *
 * 版本：1.0
 *
 * 创建日期：2024/6/26
 *
 * 描述：对上传健康请求的数据进行签名
 *
 * 修订历史：
 *
 */
class RequestUpHealthDataInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val originalRequest = chain.request()
        val modifiedRequest = originalRequest.newBuilder()

        (originalRequest.header("doSign").isNoEmpty() && originalRequest.url.toString()
            .contains(HomeApi.UP_HEALTH_DATA)).yes {//如果请求头含有doSign字段就进行签名业务
            originalRequest.body?.let { b ->
                val mediaType = b.contentType() ?: "application/json".toMediaTypeOrNull()
                val buffer = Buffer()
                b.writeTo(buffer)
                val rawBodyString = buffer.readUtf8()
                Log.e("RequestUpHealthDataInterceptor", "SOU: rawBodyString-------： ${rawBodyString}")
                
                // 解析JSON字符串为JSONObject
                try {
                    // 创建一个新的请求体，包含这些数据
                    val newJsonObject = JSONObject()
                    val jsonObject = JSONObject(rawBodyString)
                    
//                    // 使用JsonUtils.jsonToMap将JSONObject转换为Map
//                    val jsonMap = JsonUtils.jsonToMap(jsonObject)
//                    for ((key, value) in jsonMap) {
//                        Log.e("RequestUpHealthDataInterceptor", "Map键: $key, Map值: $value")
//                    }
                    
                    // 或：直接获取特定键的值
                    newJsonObject.put("data_type", jsonObject.optString("dataType", ""))
                    newJsonObject.put("data_source", "ring")
                    newJsonObject.put("data", jsonObject.optString("cusData", ""))
                    newJsonObject.put("firmware_version", jsonObject.optString("firmwareVersion", ""))
                    newJsonObject.put("mac_address", jsonObject.optString("macAddress", ""))
                    newJsonObject.put("manufacturer_id", jsonObject.optString("manufacturerId", ""))
                    newJsonObject.put("data_time", jsonObject.optString("startDataTime", ""))
                    newJsonObject.put("data_end_time", jsonObject.optString("endDataTime", ""))
                    newJsonObject.put("data_count", jsonObject.optString("dataSize", "0").toInt())
                    newJsonObject.put("software_version", "1")
                    newJsonObject.put("system_type", "Android")
                    newJsonObject.put("system_version", Build.VERSION.RELEASE.toString())
                    newJsonObject.put("timezone", TimeUtils.getCurrentUtcOffset().toString())
                    newJsonObject.put("timestamp", TimeUtils.getTimeDateLong().toString())
                    newJsonObject.put(
                        "nonce",
                        IStringUtils.getRandomListDocVo(3) + Utils.getRadom(3) + Utils.getRadom(5) + IStringUtils.getRandomListDocVo(
                            5
                        )
                    )

                    val sortedString = sortAndConcatenateFieldsByJo(newJsonObject)
                    val signTemp = MD5Utils.generateHmacSha256Signature(
                        sortedString,
                        "ocell_ring_hmac_secret_key_2025"
                    )

                    modifiedRequest.addHeader("X-Signature", signTemp)

                    // 创建新的RequestBody
                    val requestBody = newJsonObject.toString().toRequestBody(mediaType)

                    // 将新的请求体添加到modifiedRequest中
                    modifiedRequest.method(originalRequest.method, requestBody)

                    return chain.proceed(modifiedRequest.build())
                } catch (e: Exception) {
                    Log.e("RequestUpHealthDataInterceptor", "JSON解析错误: ${e.message}")
                }

            }
        }

        // 当条件不成立时，直接发送原始请求
        return chain.proceed(originalRequest)
    }
}